    Help for RAS

Properties            Events            Methods            Frequently Asked Questions

Registration Information

Order Form

Getting Custom Controls Written

Licensing Information

Description

The RAS control gives your programs easy access to the RAS sub-system.  Your program can select an Internet service from your phone book, dial and connect to the server, do any processing necessary (using our other Internet controls), and then disconnect.

File Name

MRAS1.VBX, MRAS32.OCX

ActiveX / OCX Object Name

Mabry.RASCtrl

ActiveX Compatility

VB 4.0 (32-bit) and 5.0

ActiveX Built With

Microsoft Visual C++ v4

ActiveX - Required DLLs

MFC40.DLL (October 6th, 1995 or later)

OLEPRO32.DLL  (October 6th, 1995 or later)

MSVCRT40.DLL  (September 29th, 1995 or later)

VBX Object Type

mRAS

VBX Compatibility

VB 2.0, 3.0 and 4.0 (16-bit)

VBX Built With

Microsoft Visual C++ v1.5

Distribution Note    When you develop and distribute an application that uses this control, you should install the control file into the user's Windows SYSTEM directory.  The control file has version information built into it.  So, during installation, you should ensure that you are not overwriting a newer version.


RAS Properties

Properties that have special meaning for this control or that only apply to this control are marked with an asterisk (*).

*Action Property

*Blocking Property

*CallbackNumber Property

*ConnectState Property

*ConnectStateString Property

*Domain Property

*EntryConnected Property

*EntryCount Property

*EntryList Property

*EntryName Property

*Handle Property

*LastError Property

*LastErrorString Property

*LogonName Property

*LogonPassword Property

*PhoneBook Property

*PhoneNumber Property

*RASAvailable Property

*Version Property


RAS Events

Events that have special meaning for this control or that only apply to this control are marked with an asterisk (*).

*AsyncError Event

*Done Event

*Progress Event


RAS Methods

Methods that have special meaning for this control or that only apply to this control are marked with an asterisk (*).

*AboutBox Method

*Connect Method

*CreateEntry Method

*Disconnect Method

*EditEntry Method

*GetEntry Method

*Refresh Method


Frequently Asked Questions

General Questions

I note that you can't change the dial-up networking (DUN) information as the details are held in the registry. Do you have a control that will let me change the DUN information?

Can RAS select the DUN setting to use to connect?

Is the Done event supposed to fire after I execute the Disconnect method?

How do I determine if a connection is already established?

When a "Connection Lost" dialog box pops up, I can't get RAS to re-dial.  What do I do?

How can I monitor the status of a RAS connection?

Why am I still presented with the Win95 post dialup login screen, even though I've set the LogonName and Password properties?

Under NT, the modems connect but it does not authenticate.   It appears to just sit there.  What should I do?

I'm trying to use the RAS control in Windows 3.x but it says the file RASAPI16.DLL cannot be found. Where can I get this file?

Can I use the RAS control in Windows 3.x to access Internet Explorer's dialer?

I am using the TerminateProcess API call to allow the user to interrupt a connection attempt.  However, the next time I try to establish the connection, I get an error 20602 "Port is already open".  What can I do?

How can I use the RAS control to terminate a connection that it did not establish?

How can I "save Password" in the Entry?  Each time I connect, I am asked for the Login and Password.

Internet Pack - General Questions

Why won't my Internet Pack VBXes load into VB?

Why do I get a GPF when I try to unload my form (or control) from the Done event?

With which TCP/IP stacks have your Internet controls been tested?

How do I enable/disable the Windows 95 Dial-Up Networking connect prompt when my application issues a Connect method?

Why won't my Internet Pack VBX load?

How do I convert my code from BLOCKING (Synchronous) to NON-BLOCKING (Asynchronous)?

How can I detect whether someone has entered an IP or host name?

What is the meaning of Error 20002 "unexpected server response"?

Can you recommend any good books that will help me understand Internet programming better?

Internet Pack - Blocking

I'm unclear on blocking. Can you explain it to me?

Should I use blocking or non-blocking calls?

Why do I keep getting the error "Busy executing asynchronous command"?

Why do I keep getting errors when using an Internet VBX control?

Internet Pack - Debugging

How do I tell what's happening when your control is talking to a server?


FAQ - I note that you can't change the dial-up networking (DUN) information as the details are held in the
I note that you can't change the dial-up networking (DUN) information as the details are held in the registry. Do you have a control that will let me change the DUN information?

Frequently Asked Questions

Our RAS control's GetEntry method extracts the properties of a DUN configuration into the LogonName, LogonPassword, and Domain properties. Further, the EditEntry method brings up the Win95 property window for manual editing of additional properties.

At the present time, we do not have a control for programmatically editing registry keys directly. However, this can be accomplished through the GetSetting function and SaveSetting statement.


FAQ - Can RAS select the DUN setting to use to connect?
Can RAS select the DUN setting to use to connect?

Frequently Asked Questions

Yes. The RAS control can be used to select and connect via a particular DUN configuration, using the EntryName property and the GetEntry and Connect methods.


FAQ - Is the Done event supposed to fire after I execute the Disconnect method?
Is the Done event supposed to fire after I execute the Disconnect method?

Frequently Asked Questions

No, the the Done event does not fire after a Disconnect because the Disconnect method executes immediately.  Because the Disconnect method executes immediately, there is no need for Disconnect to be non-blocking (asynchronous).


FAQ - How do I determine if a connection is already established?
How do I determine if a connection is already established?

Frequently Asked Questions

Set the EntryName property to the name of the connection you wish to check.  After you do this, you can check the EntryConnected property.  If EntryConnected is True, a connection is established for the entry specified by EntryName.  Otherwise, there is no connection.


FAQ - When a "Connection Lost" dialog box pops up, I can't get RAS to re-dial.  What do I do?
When a "Connection Lost" dialog box pops up, I can't get RAS to re-dial.  What do I do?

Frequently Asked Questions

When the line is dropped, the Win95 Dialup Networking effectively "takes control" of the socket. Any attempts by the RAS to re-establish control results in an error until the DUN dialog box is either cleared or the connection restored.

You should be able re-establish the connection using the FindWindow/ShowWindow APIs and the SendKeys statement to press the "Re-connect" button.


FAQ - How can I monitor the status of a RAS connection?
How can I monitor the status of a RAS connection?

Frequently Asked Questions

There is a  boolean property called EntryConnected that returns the status of the connection every time the property is read.  You could add a Timer that simply checks the status at regular intervals:

    Timer1_Timer()
        If RAS1.EntryConnected = False Then
            'do something
        End If
    End Sub


FAQ - Why am I still presented with the Win95 post dialup login screen, even though I've set the LogonName
Why am I still presented with the Win95 post dialup login screen, even though I've set the LogonName and Password properties?

Frequently Asked Questions

If the "Bring up Terminal window after/before dialing" is enabled for an entry, the OS will override the control and display the terminal window.  Use the Properties of the entry to disable the terminal window.


FAQ - Under NT, the modems connect but it does not authenticate.   It appears to just sit there.  What sho
Under NT, the modems connect but it does not authenticate.   It appears to just sit there.  What should I do?

Frequently Asked Questions

Make sure the entry is not configured to display a post dialup terminal window.


FAQ - I'm trying to use the RAS control in Windows 3.x but it says the file RASAPI16.DLL cannot be found.
I'm trying to use the RAS control in Windows 3.x but it says the file RASAPI16.DLL cannot be found. Where can I get this file?

Frequently Asked Questions

The RAS control provides programatic access to the Remote Access Service (RAS) sub-system. RASAPI16.DLL is part of the RAS subsystem.  Although Windows NT, Windows 95 and Windows For Workgroups offer RAS (or options to install a RAS), Windows 3.x does not.


FAQ - Can I use the RAS control in Windows 3.x to access Internet Explorer's dialer?
Can I use the RAS control in Windows 3.x to access Internet Explorer's dialer?

Frequently Asked Questions

No. The dialer that comes with IE is not the same as the RAS subsystem.


FAQ - I am using the TerminateProcess API call to allow the user to interrupt a connection attempt.  Howev
I am using the TerminateProcess API call to allow the user to interrupt a connection attempt.  However, the next time I try to establish the connection, I get an error 20602 "Port is already open".  What can I do?

Frequently Asked Questions

Whenever the RAS control is unloaded from memory, the connection should be cleared.  If the TerminateProcess is only terminating the process but not unloading your application, you could place the control on a separate form and unload the form that contains the control in the routine that terminates the process.  Then, just reload this form.  This way, your application can stay loaded but the connection can be cleared.  This would require that all references to the control include the Form.  In other words, mRas1.Connect would be changed to Form1.mRas1.Connect.


FAQ - How can I use the RAS control to terminate a connection that it did not establish?
How can I use the RAS control to terminate a connection that it did not establish?

Frequently Asked Questions

You can't. The Mabry RAS control uses the RAS subsystem's DLLs to establish/terminate a connection, but like any DLL it can be called by another program and used in a separate address space. The programmers are looking into whether the control should terminate somebody else's connection.


FAQ - How can I "save Password" in the Entry?  Each time I connect, I am asked for the Login and Password.
How can I "save Password" in the Entry?  Each time I connect, I am asked for the Login and Password.

Frequently Asked Questions

If using the VBX version, the OS will always prompt you for a logon name and password because the 16 bit version of the RAS subsystem doesn't support the GetEntry, EditEntry, or CreateEntry methods. You should be able to simply set these values, but you'll have to store them yourself in an INI file.  If using the OCX version, it depends on whether or not  the entry has the Save Password check box checked.


FAQ - Why won't my Internet Pack VBXes load into VB?
Why won't my Internet Pack VBXes load into VB?

Frequently Asked Questions

The VBXes are looking for a file called WINSOCK.DLL. This DLL should be in your Windows directory (most DLLs are located in your Windows\System directory -- this one is an exception). Look for WINSOCK.DLL.  If it's not in your Windows directory, we recommend moving it there. Be sure to write down where it was, in case something goes wrong.

Also, check the date on your WINSOCK.DLL. If it's 1994 or before, you should look into getting a later version.


FAQ - Why do I get a GPF when I try to unload my form (or control) from the Done event?
Why do I get a GPF when I try to unload my form (or control) from the Done event?

Frequently Asked Questions

This is not uncommon in many controls. If the form containing the control is unloaded but the control's C++ code for the event has to reference the control, the GPF will occur because the control is no longer available after it is has been unloaded. The solution is to enable a timer in the Done event and have the Timer unload the form (or control).


FAQ - With which TCP/IP stacks have your Internet controls been tested?
With which TCP/IP stacks have your Internet controls been tested?

Frequently Asked Questions

The majority of our internal testing is done on either NT's or Win95's standard stacks. We also utilize a 3.1 machine running Trumpet Winsock.

As part of our beta program, the controls wind up on a variety of stacks like Novell (known to have differences in Winsock, but should be OK with the latest patches from Novell), WFWG (also has a known problem that can cause FTP trouble, but MS has a patch for that product as well (article ID Q122544)).

The controls support the standard Winsock interface, so in general, the 16-bit environments that do not come with a default stack (I.e., Windows 3.x) may involve a bit more setup, but as long as some reputable stack is used, there shouldn't be any problems.


FAQ - How do I enable/disable the Windows 95 Dial-Up Networking connect prompt when my application issues
How do I enable/disable the Windows 95 Dial-Up Networking connect prompt when my application issues a Connect method?

Frequently Asked Questions

The fact that the DUN pops up when attempting to establish a network connection is a Win95 OS setting. To change this behavior, choose Dial Up Networking from "My Computer", and select "Settings..." from the "Connections" menu. Set the desired value in the "When establishing a network connection" frame.


FAQ - Why won't my Internet Pack VBX load?
Why won't my Internet Pack VBX load?

Frequently Asked Questions

Usually, the Internet VBXes won't load when the WINSOCK.DLL is missing.  Make sure you have a current WINSOCK.DLL in the Windows or Windows\System sub-dir. Some versions of Windows 3.x WinSocks may actually require a TCP/IP connection.


FAQ - How do I convert my code from BLOCKING (Synchronous) to NON-BLOCKING (Asynchronous)?
How do I convert my code from BLOCKING (Synchronous) to NON-BLOCKING (Asynchronous)?

Frequently Asked Questions

A quick fix for converting Blocking code to non-blocking code is as follows:

    Blocking=False

In the Declarations of the Form, add:

    Private fDone as Boolean

In the Done event of the control set the fDone flag as shown:

    Private Sub FTP1_Done()
        fDone = True
    End Sub

Then, when invoking a method, just loop until the Done event sets the fDone flag.

    fDone = False
    mMail1.Connect
    Do
        DoEvents
        'here is where your application
        'can do other things
    Loop Until (fDone)

Note: you may want to set a timer in the loop so it will not loop endlessly should some problem occur. Also, depending upon your code you may want to conditionally set the fDone flag in the AsyncError event.


FAQ - How can I detect whether someone has entered an IP or host name?
How can I detect whether someone has entered an IP or host name?

Frequently Asked Questions

You can use the function (below) to check for a host name or IP address.

' This Function receives a string argument and
' validates whether the string is a valid IP value,
' by verifying that it is in the format of w.x.y.z and
' that each octet is between 0 and 255
'
' Returns True if IP there are 4 octets and each is
' between 0 and 255.
'
' Returns False in all other cases
'
' Disclaimer -- this function will not detect certain
' values such as netmasks like 255.255.255.255,
' which meet the criteria but are not valid IPs.
'
Private Function Valid_IP(IP As String) As Boolean
    Dim i As Integer
    Dim dot_count As Integer
    Dim test_octect As String

    IP = Trim$(IP)

    ' make sure the IP long enough before
    ' continuing
    If Len(IP) < 8 Then
        Valid_IP = False
        Exit Function
    End If

    i = 1
    dot_count = 0
    For i = 1 To Len(IP)
        If Mid$(IP, i, 1) = "." Then
            ' increment the dot count and
            ' clear the test octet variable
            dot_count = dot_count + 1
            test_octet = ""
            If i = Len(IP) Then
                ' we've ended with a dot
                ' this is not good
                Valid_IP = False
                Exit Function
            End If
        Else
            test_octet = test_octet & Mid$(IP, i, 1)
            On Error Resume Next
            byte_check = CByte(test_octet)
            If (Err) Then
                ' either the value is not numeric
                ' or exceeds the range of the byte
                ' data type.
                Valid_IP = False
                Exit Function
            End If
        End If
    Next i
    ' so far, so good
    ' did we get the correct number of dots?
    If dot_count <> 3 Then
        Valid_IP = False
        Exit Function
    End If
    ' we have a valid IP format!
    Valid_IP = True
End Function


FAQ - What is the meaning of Error 20002 "unexpected server response"?
What is the meaning of Error 20002 "unexpected server response"?

Frequently Asked Questions

The control has issued some command and the server did not accept it.  It could be anything from an improperly formatted e-mail address to an unimplemented command on the server.  You'll have to enable debugging to see what the command and reply are.


FAQ - Can you recommend any good books that will help me understand Internet programming better?
Can you recommend any good books that will help me understand Internet programming better?

Frequently Asked Questions

Any good book on TCP/IP would be helpful.  From personal experience, tech support recommends "TCP/IP" by Dr. Sidnie Feit, published by McGraw-Hill .  It is not written from a programming standpoint, but does include everything you'd want to know about the lower levels of the OSI stack (including TCP/UDP/IP, etc.).


FAQ - I'm unclear on blocking. Can you explain it to me?
I'm unclear on blocking. Can you explain it to me?

Frequently Asked Questions

When your application requests data from a network connection, it is hard to predict how long it will take before the data arrives and the call can complete. As a programmer, you have to determine whether to wait for the outcome of the call, or return immediately to your application and get the data when the data arrives.

Calls that wait, are called blocking calls. Because the call must complete before the application continues, blocking calls are also referred to as synchronous calls.

Calls that return control to your application immediately are called non-blocking calls. Since your application can perform tasks while the call is retrieving the data, non-blocking calls are also referred to as asynchronous calls.

Mabry Internet controls support both blocking and non-blocking calls.

It is important to note that even when using blocking calls, Windows can send event messages (such as Timer events, mouse clicks, etc.) to your application and it can respond to them. This can result in errors. It is the responsibility of the programmer to minimize the likelyhood of these situations (such as disabling any Timers or command buttons that will interrupt the call) and handle any errors should such conditions arise.

Error handling is very important when issuing calls to a network. Always use some method of On Error handling when invoking blocking calls. For non-blocking calls, normal On Error handling is required in addition to responding to the AsyncError event.


FAQ - Should I use blocking or non-blocking calls?
Should I use blocking or non-blocking calls?

Frequently Asked Questions

It depends on your application. See the explanation on blocking calls for a complete description of blocking vs. non-blocking.


FAQ - Why do I keep getting the error "Busy executing asynchronous command"?
Why do I keep getting the error "Busy executing asynchronous command"?

Frequently Asked Questions

A call has been invoked but a previous call has not been completed yet. Either set Blocking mode to true or wait for the Done event before issuing subsequent commands.

It is important to note that even when using blocking calls, Windows can send event messages (such as Timer events, mouse clicks, etc.) to your application and it can respond to them. This can result in errors. It is the responsibility of the programmer to minimize the likelyhood of these situations (such as disabling any Timers or command buttons that will interrupt the call) and handle any errors should such conditions arise.


FAQ - Why do I keep getting errors when using an Internet VBX control?
Why do I keep getting errors when using an Internet VBX control?

Frequently Asked Questions

A call has been invoked but a previous call has not been completed yet. Either set Blocking mode to true or wait for the Done event before issuing subsequent commands.

It is important to note that even when using blocking calls, Windows can send event messages (such as Timer events, mouse clicks, etc.) to your application and it can respond to them. This can result in errors. It is the responsibility of the programmer to minimize the likelihood of these situations (such as disabling any Timers or command buttons that will interrupt the call) and handle any errors should such conditions arise.


FAQ - How do I tell what's happening when your control is talking to a server?
How do I tell what's happening when your control is talking to a server?

Frequently Asked Questions

The Internet Pack controls have debugging support built-in.  Simply set the Debug property on the control to 1 and then add the following code to the Debug event of the control:

    Debug.Print Message


Registration Information

CREDITS

RAS was written by James Shields.

CONTACT INFORMATION

Orders, inquiries, technical support, questions, comments, etc. can be sent to mabry@mabry.com on the Internet.  Our mailing address/contact information is:

Mabry Software, Inc.

Post Office Box 31926

Seattle, WA  98103-1926

Sales: 1-800-99-MABRY (U.S. Only)

Voice: 206-634-1443

Fax: 206-632-0272 or 206-364-3196

Web: http://www.mabry.com

COST

The price of RAS (control only) is US$20 (US$25 for International orders).  The cost of RAS and the C/C++ source code (of the control itself) is US$45 (US$50 for International orders).

Prices are subject to change without notice.

DELIVERY METHODS

We can ship this software to you via air mail and/or e-mail.

Air Mail - you will receive disks, a printed manual, and printed receipt if you choose this delivery method.  The costs are:

US$5.00 	US Priority Mail

US$10.00 	AirBorne Express 2nd Day (US deliveries only)

US$15.00 	AirBorne Express Overnight (US deliveries only)

US$45.00 	International AirBorne Express.

E-Mail - We can ship this package to you via e-mail.  You need to have an e-mail account that can accept large file attachments (which includes CompuServe, AOL, and most Internet providers).  If you choose this option, please note: a printed manual is not included.  We will, however, e-mail a receipt to you.

Be sure to include your full mailing address with your order.  Sometimes (on the Internet) the package cannot be e-mailed, so we are forced to send it through the normal mails.

CompuServe E-Mail - CompuServe members can use the software registration forum (GO SWREG) to register this package.  RAS' SWREG ID number is 13886.  The source code version's ID number is 13887.  PLEASE NOTE: When you order through SWREG, we send the registered package to your CompuServe account (not your Internet or AOL account) within a few hours.

ORDER / PAYMENT METHODS

You can order this software by phone, fax, e-mail, mail.  For your convenience, an order form has been provided that you can print out directly from this help file.

Please note that orders must include all information that is requested on our order form.   Your shipment WILL BE DELAYED if we have to contact you for additional information (such as phone number, street address, etc.).

You can pay by credit card (VISA, MasterCard, American Express), check (U.S. dollars drawn on a U.S. bank), cash, International Money Order, International Postal Order, Purchase Order (established business entities only - terms net 30), or wire transfer.

WIRE TRANSFER INFORMATION

Here is the information you need regarding our account for a wire funds transfer:

Bank Name: 	SeaFirst - Stone Way Branch

Bank Address: 	3601 Stone Way North

Seattle, WA  98103

Bank Phone: 	206-585-4951

Account Name: 	Mabry Software, Inc.

Routing Number: 	12000024

Account Number: 	16311706

If you are paying with a wire transfer of funds, please add US$12.50 to your order.  This is the fee that SeaFirst Bank charges Mabry Software.  Also, please ADD ANY ADDITIONAL FEES THAT YOUR BANK MAY CHARGE for wire transfer service. If you are paying with a  wire transfer, we must have full payment deposited to our account before we can ship your order.

Copyright © 1997 by Mabry Software, Inc.


Order Form
 RAS Order Form

Use the Print Topic... command from the File menu to print this order form.

Mail this 	Mabry Software, Inc.

form to: 	Post Office Box 31926

Seattle, WA  98103-1926

Phone: 206-634-1443

Fax: 206-632-0272 or 206-364-3196

Internet: mabry@mabry.com

Web: www.mabry.com

Where did you get this copy of RAS?

____________________________________________________________________

Name: 	____________________________________________________________________

Ship to: 	____________________________________________________________________

____________________________________________________________________

____________________________________________________________________

____________________________________________________________________

Phone: 	_________________________________________________________________

Fax: 	_________________________________________________________________

E-Mail: 	_________________________________________________________________

MC/VISA/AMEX: _________________________________________ exp. __________________

P.O. # (if any): 	____________________ Signature ____________________________________

qty ordered 	____ 	REGISTRATION
$20.00 ($25.00 international).  Check or money order in U.S. currency drawn on a U.S. bank.  Add $5.00 per order for shipping and handling.

qty ordered 	____ 	SOURCE CODE AND REGISTRATION
$45.00 ($50.00 international).  Check or money order in U.S. currency drawn on a U.S. bank.  Add $5.00 per order for shipping and handling.


Error Codes

Value	   	Description

20601	Invalid Port Handle

20602	Port Already Open

20603	Buffer Too Small

20604	Wrong Info Specified

20605	Cannot Set Port Info

20606	Port Not Connected

20607	Event Invalid

20608	Device Does Not Exist

20609	Device Type Does Not Exist

20610	Buffer Invalid

20611	Route Not Available

20612	Route Not Allocated

20613	Invalid Compression Specified

20614	Out Of Buffers

20615	Port Not Found

20616	Async Request Pending

20617	Already Disconnecting

20618	Port Not Open

20619	Port Disconnected

20620	No Endpoints

20621	Cannot Open Phonebook

20622	Cannot Load Phonebook

20623	Cannot Find Phonebook Entry

20624	Cannot Write Phonebook

20625	Corrupt Phonebook

20626	Cannot Load String

20627	Key Not Found

20628	Disconnection

20629	Remote Disconnection

20630	Hardware Failure

20631	User Disconnection

20632	Invalid Size

20633	Port Not Available

20634	Cannot Project Client

20635	Unknown

20636	Wrong Device Attached

20637	Bad String

20638	Request Timeout

20639	Cannot Get LANA

20640	NetBIOS Error

20641	Server Out Of Resources

20642	Name Exists On Net

20643	Server General Net Failure

20645	Auth Internal

20646	Restricted Logon Hours

20647	Account Disabled

20648	Password Expired

20649	Not Dial In Permission

20650	Server Not Responding

20651	From Device

20652	Unrecognized Response

20653	Macro Not Found

20654	Macro Not Defined

20655	Message Macro Not Found

20656	DefaultOFF Macro Not Found

20657	File Count Not Be Opened

20658	Device Name Too Long

20659	Device Name Not Found

20660	No Responses

20661	No Command Found

20662	Wrong Key Specified

20663	Unknown Device Type

20664	Allocating Memory

20665	Port Not Configured

20666	Device Not Ready

20667	Reading INI File

20668	No Connection

20669	Bad Usage In INI File

20670	Reading Section Name

20671	Reading Device Type

20672	Reading Device Name

20673	Reading Usage

20674	Reading Max Connection BPS

20675	Reading Max Carrier BPS

20676	Line Busy

20677	Voice Answer

20678	No Answer

20679	No Carrier

20680	No Dialtone

20681	In Command

20682	Writing Section Name

20683	Writing Device Type

20684	Writing Device Name

20685	Writing Max Connection BPS

20686	Writing Max Carrier BPS

20687	Writing Usage

20688	Writing DefaultOFF

20689	Reading DefaultOFF

20690	Empty INI File

20691	Authentication Failure

20692	Port Or Device

20693	Not Binary Macro

20694	DCB Not Found

20695	State Machines Not Started

20696	State Machines Already Started

20697	Partial Response Looping

20698	Unknown Response Key

20699	Receive Buffer Full

20700	Command Too Long

20701	Unsupported BPS

20702	Unexpected Response

20703	Interactive Mode

20704	Bad Callback Number

20705	Invalid Auth State

20706	Writing Init BPS

20707	X25 Diagnostic

20708	Account Expired

20709	Changing Password

20710	Overrun

20711	RASMAN Cannot Initialize

20712	Biplex Port Not Available

20713	No Active ISDN Lines

20714	No ISDN Channels Available

20715	Too Many Line Errors

20716	IP Configuration

20717	No IP Addresses

20718	PPP Timeout

20719	PPP Remote Terminated

20720	PPP No Protocols Configured

20721	PPP No Response

20722	PPP Invalid Packet

20723	Phone Number Too Long

20724	IPXCP No Dialout Configured

20725	IPXCP No Dialin Configured

20726	IPXCP Dialout Already Active

20727	Accessing TCPCFGDLL

20728	No IP RAS Adapter

20729	SLIP Requires IP

20730	Projection Not Complete

20731	Protocol Not Configured

20732	PPP Not Converging

20733	PPP CP Rejected

20734	PPP LCP Terminated

20735	PPP Required Address Rejected

20736	PPP NCP Terminated

20737	PPP Loopback Detected

20738	PPP No Address Assigned

20739	Cannot Use Logon Credentials

20740	TAPI Configuration

20741	No Local Encryption

20742	No Remote Encryption

20743	Remote Requires Encryption

20744	IPXCP Net Number Conflict

20745	Invalid SMM

20746	SMM Uninitialized

20747	No MAC For Port

20748	SMM Timeout

20749	Bad Phone Number

20750	Wrong Module


Action Property See Also
See Also

Connect Method

CreateEntry Method

Disconnect Method

Done Event

EditEntry Method

GetEntry Method

Refresh Method


AsyncError Event See Also
See Also

Action Property

Done Event

LastError Property


Blocking Property See Also
See Also

Action Property

AsyncError Event

Done Event

LastError Property


CallbackNumber Property See Also
See Also

Action Property

Connect Method

Domain Property

EntryCount Property

EntryList Property

EntryName Property

PhoneNumber Property

Refresh Method


Connect Method See Also
See Also

Action Property

Connect Method

Domain Property

EntryCount Property

EntryList Property

EntryName Property

PhoneNumber Property

PhoneBook Property

Refresh Method


ConnectState Property See Also
See Also

Action Property

Connect Method

ConnectStateString Property

Done Event


ConnectStateString Property See Also
See Also

Action Property

Connect Method

ConnectState Property

Done Event


CreateEntry Method See Also
See Also

Action Property

EditEntry Method

EntryCount Property

EntryList Property

EntryName Property

LastError Property

PhoneBook Property


Disconnect Method See Also
See Also

Action Property

Connect Method

LastError Property


Domain Property See Also
See Also

Action Property

CallbackNumber Property

Connect Method

EntryCount Property

EntryList Property

EntryName Property

PhoneNumber Property

Refresh Method


Done Event See Also
See Also

AsyncError Event

ConnectState Property

ConnectStateString Property

LastError Property

LastErrorString Property

Progress Event


EditEntry Method See Also
See Also

Action Property

CreateEntry Method

EntryCount Property

EntryList Property

EntryName Property

LastError Property

PhoneBook Property


EntryConnected Property See Also
See Also

EntryName Property


EntryCount Property See Also
See Also

Action Property

EntryList Property

Refresh Method


EntryList Property See Also
See Also

Action Property

EntryCount Property

EntryName Property

Refresh Method


EntryName Property See Also
See Also

Action Property

Connect Method

EntryCount Property

EntryList Property

PhoneNumber Property

Refresh Method


GetEntry Method See Also
See Also

Action Property

CreateEntry Method

EditEntry Method


Handle Property See Also
See Also

Action Property

Connect Method

Disconnect Method


LastError Property See Also
See Also

Action Property

AsyncError Event

Done Event

LastErrorString Property


LastErrorString Property See Also
See Also

LastError Property


LogonName Property See Also
See Also

LogonPassword Property


LogonPassword Property See Also
See Also

LogonName Property


PhoneBook Property See Also
See Also

Action Property

Connect Method

CreateEntry Method

Disconnect Method

EditEntry Method

GetEntry Method


PhoneNumber Property See Also
See Also

Action Property

CallbackNumber Property

Connect Method

Domain Property

EntryCount Property

EntryList Property

EntryName Property

PhoneNumber Property

Refresh Method


Progress Event See Also
See Also

Action Property

Connect Method

ConnectState Property

ConnectStateString Property

Done Event


Refresh Method See Also
See Also

Action Property

EntryCount Property

EntryList Property

EntryName Property

LastError Property

PhoneBook Property


AboutBox Method

Error Codes            Frequently Asked Questions

Description

displays the About Box for the control.

Syntax

object.AboutBox

The syntax of the AboutBox method has these parts:

Part	   	Description

object	Required. A RAS control.

Remarks

This method displays the About Box for this control to display copyright information.

VBX Note: This method (and its Action property equivalent) is not available in the VBX version of this control.


Action Property

See Also            Error Codes            Frequently Asked Questions

Description

Causes control to initiate a command / method.

Syntax

object.Action [= integer ]

The syntax of the Action property has these parts:

Part	   	Description

object	A RAS control.

integer	An integer that specifies the action to perform.

Remarks

Setting this property makes the RAS control perform an action.  The action depends on the value set.  RAS accepts the following:

Constant	   	Value	   	Description

RasActionNone	0	No action

RasActionConnect	1	Connect server (Connect)

RasActionGetEntry	2	Get phone book entry (GetEntry).  Only available in the ActiveX / OCX version.

RasActionDisconnect	3	Disconnect from server (Disconnect)

RasActionRefresh	4	Refresh phone book list (Refresh)

RasActionCreateEntry	5	Create entry in phone book (CreateEntry)  Only available in the ActiveX / OCX version.

RasActionEditEntry	6	Edit entry in phone book (EditEntry)  Only available in the ActiveX / OCX version.

This property is present in VBX and OCX versions of this control.  It is in the OCX version to maintain property compatibility.  OCX users can use this property or the method equivalents to perform actions.

VBX Note: Methods are not available in the VBX version of this control.  Methods are only in the ActiveX / OCX version.  When using the VBX, you must use the Action property instead of the equivalent method.

Data Type

Integer


AsyncError Event

See Also            Error Codes            Frequently Asked Questions

Description

Fired when an error occurs during asynchronous operations

Syntax

Sub object_AsyncError([index As Integer,] errornumber As Integer, errormessage As String)

The syntax of the AsyncError event has these parts:

Part	   	Description

object	A RAS control.

index	An integer that identifies a control if it's in a control array.

errornumber	An integer that holds the current error number.

errormessage	A string expression that holds text describing the current error.

Remarks

If an error occurs during the execution of asynchronous commands (only possible when Blocking is set to False) the program is notified by firing the AsyncError event.


Blocking Property

See Also            Error Codes            Frequently Asked Questions

Description

Determines if any methods or actions are blocking.

Syntax

object.Blocking [= boolean ]

The syntax of the Blocking property has these parts:

Part	   	Description

object	A RAS control.

boolean	A boolean flag that determines if the control waits until a command is finished, or, returns control immediately and then fires an event when done.

Remarks

If this property is set to True, any commands using either the Action property or any of the methods will not return to your code until the command completes.  In other words, the command will be handled synchronously.

If this property is false, any commands are handled asynchronously.  They return to you immediately.  You are notified of completion with the Done event.  When the user-interface requires that the user be able to cancel file transfers, it is recommended that Blocking be set to False so that your program can respond quickly to user actions.

Important Note: The Blocking property must not be changed while a connection is established.  You should only change the Blocking property when the control is not connected to a server.  Changing the Blocking property while connected could cause some strange behavior in the control.

Data Type

Integer (boolean)


CallbackNumber Property

See Also            Error Codes            Frequently Asked Questions

Description

Determines the number that the server will call back during the connection process.

Syntax

object.CallbackNumber [= string ]

The syntax of the CallbackNumber property has these parts:

Part	   	Description

object	A RAS control.

string	A string expression that specifies a phone number.

Remarks

This property specifies a callback phone number (if one is needed).  If this property is empty, callback is not used.  Callbacks are only made if both the server and the local RAS sub-system are setup to do so.

Data Type

String


ConnectStateString Property

See Also            Error Codes            Frequently Asked Questions

Description

Holds the human readable string that corresponds to the value in the ConnectState property.

Syntax

object.ConnectStateString

The syntax of the ConnectStateString property has these parts:

Part	   	Description

object	A RAS control.

Remarks

This property contains the human readable string that holds the current state of the connection process (dialing).  It contains a string which describes the value of ConnectState.

This property is read-only and only available at run-time.  This property only holds a meaningful value while RAS connects to a server.

Data Type

String


Connect Method

See Also            Error Codes            Frequently Asked Questions

Description

This method makes the RAS sub-system connect to the specified Internet server.

Syntax

object.Connect

The syntax of the Connect method has these parts:

Part	   	Description

object	Required. A RAS control.

Remarks

This method causes the RAS subsystem to dial the specified server (specified by PhoneBook and EntryName or by PhoneNumber).

The simplest way to dial is to set the PhoneBook and EntryName properties.  Then, use the GetEntry method (to ensure that all of the properties are filled with their appropriate values).  Note: It is very important to use the GetEntry method (or its Action property equivalent) -- this will ensure that the other properties, such as LogonName and LogonPassword, are set properly from the phone book.

Or, you can set the PhoneNumber, LogonName and LogonPassword properties.  Then execute the Connect method.  This, however, is not the recommended method.  It is far better to have a phone book entry and use it to dial.

While this method executes, your program will receive the Progress event.  In this event, your program can access the ConnectState and ConnectStateString properties to follow the progress of the dialing / connection.  The connection process is not complete until the ConnectState property reaches either connected (8192) or disconnected (8193).

If the Blocking property is True, you can cancel a connection attempt by using the Disconnect method (or its Action equivalent).

Windows 95 Note: all phone book entries are kept in the registry.  So, the PhoneBook property is ignored.

VBX Note: Methods are not available in the VBX version of this control.  Methods are only in the ActiveX / OCX version.  When using the VBX, you must use the Action property instead of the equivalent method.


ConnectState Property

See Also            Error Codes            Frequently Asked Questions

Description

Holds the status of dialing / connecting.

Syntax

object.ConnectState

The syntax of the ConnectState property has these parts:

Part	   	Description

object	A RAS control.

Remarks

This property contains the current state of dialing (using the Connect method or Action property).  You should not rely on these values to come in any particular order during a connection.

Value	   	Description

0	Open Port

1	Port Opened

2	Connect Device

3	Device Connected

4	All Devices Connected

5	Authenticate

6	Authenticate Notify

7	Authenticate Retry

8	Authenticate Callback

9	Authenticate Change Password

10	Authenticate Project

11	Authenticate Link Speed

12	Authenticate Ack

13	ReAuthenticate

14	Authenticated

15	Prepare for Callback

16	Wait for Modem Reset

17	Wait for Callback

18	Projected

19	Start Authentication

20	Callback Complete

21	Logon Network

4096	Interactive

4097	Retry Authentication

4098	Callback Set By Caller

4099	Password Expired

8192	Connected

8193	Disconnected.  In this case, the ConnectStateString property may contain the reason for not connecting.  The string may be one of the following:

Disconnected - Line Busy
Disconnected - Voice Answer
Disconnected - No Answer
Disconnected - No Carrier
Disconnected - No Dialtone
Disconnected

This property is read-only and only available at run-time.  This property only holds a meaningful value while RAS connects to a server.

Data Type

Integer


CreateEntry Method

See Also            Error Codes            Frequently Asked Questions

Description

Displays dialog box which allows user to create a phone book entry.

Syntax

object.CreateEntry

The syntax of the CreateEntry method has these parts:

Part	   	Description

object	Required. A RAS control.

Remarks

The CreateEntry method (or its Action property equivalent) displays a dialog box which allows the user to create a new phone book entry.  The entry ends up in the phone book specified by the PhoneBook property.

After this you should execute the Refresh method (or Action) to get the list of entries in the current phone book.

Windows 95 Note: all phone book entries are kept in the registry.  So, the PhoneBook property is ignored.

VBX Note: This method (and its Action property equivalent) is not available in the VBX version of this control.


Disconnect Method

See Also            Error Codes            Frequently Asked Questions

Description

Makes RAS control disconnect from the Internet server.

Syntax

object.Disconnect

The syntax of the Disconnect method has these parts:

Part	   	Description

object	Required. A RAS control.

Remarks

This method disconnects the computer from the Internet server. If there is no connection, this method does nothing.

This action executes immediately.  Even when Blocking is False, this method does not fire the Done event.

VBX Note: Methods are not available in the VBX version of this control.  Methods are only in the ActiveX / OCX version.  When using the VBX, you must use the Action property instead of the equivalent method.


Domain Property

See Also            Error Codes            Frequently Asked Questions

Description

Specifies domain where authentication should occur.

Syntax

object.Domain [= string ]

The syntax of the Domain property has these parts:

Part	   	Description

object	A RAS control.

string	A string expression that specifies a domain name.

Remarks

This property determines the domain where user authentication should occur.  If this property is blank, the Internet server's domain is used to authenticate.

Normally this property should be blank.

Data Type

String


Done Event

See Also            Error Codes            Frequently Asked Questions

Description

This event procedure is fired when the control completes an action or method.

Syntax

Sub object_Done([index As Integer])

The syntax of the Done event has these parts:

Part	   	Description

object	A RAS control.

index	An integer that identifies a control if it's in a control array.

Remarks

Fired when a method has finished executing without error.  If an error occurs during execution of any method and Blocking is True, then an error is thrown by the control and must be handled by On Error.

When Blocking is False, an error may be thrown during execution of a method as it is when Blocking is True.  However, errors which occur during background execution of methods when Blocking is False will result in firing of the AsyncError event.


EditEntry Method

See Also            Error Codes            Frequently Asked Questions

Description

Displays dialog box where the user can edit a phone book entry.

Syntax

object.EditEntry

The syntax of the EditEntry method has these parts:

Part	   	Description

object	Required. A RAS control.

Remarks

The EditEntry method (or its Action property equivalent) displays a dialog box which allows the user to edit an existing phone book entry.  The entry ends up in the phone book specified by the PhoneBook property.

Windows 95 Note: all phone book entries are kept in the registry.  So, the PhoneBook property is ignored.

VBX Note: This method (and its Action property equivalent) is not available in the VBX version of this control.


EntryConnected Property

See Also            Error Codes            Frequently Asked Questions

Description

Returns whether or not the RAS entry (specified by EntryName) is connected.

Syntax

object.EntryConnected

The syntax of the EntryConnected property has these parts:

Part	   	Description

object	A RAS control.

Remarks

This property returns a boolean which is set to True if the RAS entry named by the EntryName property is connected at the time the property is checked.  Refresh is not required to update this property and the connection status is checked each time the the EntryConnected property is examined.

Data Type

Integer (boolean)


EntryCount Property

See Also            Error Codes            Frequently Asked Questions

Description

Returns the number of items in the EntryList property array.

Syntax

object.EntryCount

The syntax of the EntryCount property has these parts:

Part	   	Description

object	A RAS control.

Remarks

This property returns the number of phone book entries in the EntryList property array.

This property is filled when the control first loads and when the Refresh method is executed.  This property is read-only at run-time only.

Data Type

Integer


EntryList Property

See Also            Error Codes            Frequently Asked Questions

Description

Holds the list of entries from a phone book.

Syntax

object.EntryList [= index ]

The syntax of the EntryList property has these parts:

Part	   	Description

object	A RAS control.

index	An integer that indentifies an entry in the property array.

Remarks

This property returns the names of phone book entries found in the phone book specified by the PhoneBook property.  The names in this list are used to fill the EntryName property when connecting to a server (via the Connect method) or editing an entry.

This property is filled when the control first loads and when the Refresh method is executed.  This property is read-only at run-time only.

Data Type

String


EntryName Property

See Also            Error Codes            Frequently Asked Questions

Description

Specifies an entry in a phone book.

Syntax

object.EntryName [= string ]

The syntax of the EntryName property has these parts:

Part	   	Description

object	A RAS control.

string	A string expression that specifies a RAS phone book entry name.

Remarks

This property holds the name of the current phone book entry loaded (or of the phone book entry to load with the GetEntry method or Action property).

Data Type

String


GetEntry Method

See Also            Error Codes            Frequently Asked Questions

Description

Loads properties with data from a phone book entry.

Syntax

object.GetEntry

The syntax of the GetEntry method has these parts:

Part	   	Description

object	Required. A RAS control.

Remarks

This method loads an entry (EntryName) from a phone book (specified by the PhoneBook property).  Before using this property, you must set the EntryName and PhoneBook properties.

If the entry is found, the LogonName, LogonPassword, CallbackNumber and Domain properties are filled from the phone book.

General Note: This method does not load the PhoneNumber property.  This is due to the fact that the RAS sub-system does not return the value to the RAS Control.  You do not need this property to connect to an server.  In fact, since you have the EntryName, you can connect to a server using just that (along with the LogonName and LogonPassword properties.

Windows 95 Note: all phone book entries are kept in the registry.  So, the PhoneBook property is ignored.

VBX Note: This method (and its Action property equivalent) is not available in the VBX version of this control.


Handle Property

See Also            Error Codes            Frequently Asked Questions

Description

Returns the connection handle (if connected to a server).

Syntax

object.Handle

The syntax of the Handle property has these parts:

Part	   	Description

object	A RAS control.

Remarks

After the control has connected to a server, this property holds the connection handle.  This handle is typically for information uses only

This property is read-only and only available at run-time.

Data Type

Integer (long)


LastError Property

See Also            Error Codes            Frequently Asked Questions

Description

Holds the last error number reported.

Syntax

object.LastError

The syntax of the LastError property has these parts:

Part	   	Description

object	A RAS control.

Remarks

This property contains the result of the last method executed.  It is zero if the last method completed without error.  Otherwise, it contains an error code.

This property is read-only and only available at run-time.

Data Type

Integer


LastErrorString Property

See Also            Error Codes            Frequently Asked Questions

Description

Holds a description of the last error number reported.

Syntax

object.LastErrorString

The syntax of the LastErrorString property has these parts:

Part	   	Description

object	A RAS control.

Remarks

This property contains the result of the last method executed.  It is zero if the last method completed without error.  Otherwise, it contains an error code.

This property is read-only and only available at run-time.

Data Type

String


LogonName Property

See Also            Error Codes            Frequently Asked Questions

Description

Name to use when connecting to the server.

Syntax

object.LogonName

The syntax of the LogonName property has these parts:

Part	   	Description

object	A RAS control.

Remarks

RAS servers require a username and password.  This property is sent to the server when it asks for a name.

Data Type

String


LogonPassword Property

See Also            Error Codes            Frequently Asked Questions

Description

Password to use when connecting to the server.

Syntax

object.LogonPassword

The syntax of the LogonPassword property has these parts:

Part	   	Description

object	A RAS control.

Remarks

RAS servers require a username and password.  This property is sent to the server when it asks for a password.

Data Type

String


PhoneBook Property

See Also            Error Codes            Frequently Asked Questions

Description

Specifies the phone book file to use when dialing.

Syntax

object.PhoneBook [= filename ]

The syntax of the PhoneBook property has these parts:

Part	   	Description

object	A RAS control.

filename	A string expression that specifies the filename of a  RAS phone book.

Remarks

This property determines the phone book to use when dialing or creating/editing phone book entries.  This property should contain the full path and filename of the phone book file.

Windows 95 Note: Under Windows 95 all RAS phone book entries are kept in the registry.  This property is ignored under Windows 95.

Windows NT Note:The path to the default phone book can be found in the Registry.  The key is HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\RAS\CurrentVersion.  The value to read is PathName.  The filename of the default phone book is RASPHONE.PBK.

Data Type

String


PhoneNumber Property

See Also            Error Codes            Frequently Asked Questions

Description

Internet server's phone number.

Syntax

object.PhoneNumber [= string ]

The syntax of the PhoneNumber property has these parts:

Part	   	Description

object	A RAS control.

string	A string expression that specifies a phone number.

Remarks

This is the phone number that the RAS sub-system uses to dial the Internet server.  Typically this property is filled in by the GetEntry method or Action property.

When dialing (using the Connect method or Action property equivalent), this property is ignored if the EntryName property is not empty.  In that case, the RAS sub-system retrieves the phone number from the phone book entry specified by the EntryName property.

Data Type

String


Progress Event

See Also            Error Codes            Frequently Asked Questions

Description

Fires during a connection (dialing).

Syntax

Sub object_Progress([index As Integer,] connectstate As Integer)

The syntax of the Progress event has these parts:

Part	   	Description

object	A RAS control.

index	An integer that identifies a control if it's in a control array.

connectstate	An integer that specifies the current state of dialing.

Remarks

This event fires while the RAS sub-system attempts to connect to an Internet server.  The connectstate parameter is identical to the ConnectState property.

If you want a string to display to the user, use the ConnectStateString property.  While the text in this property is brief, it is also accurate.

Dialing / connection is complete when the connectstate parameter is either 8192 (Connected) or 8193 (Disconnected).  See the ConnectState property for more information on the values of connectstate.


RASAvailable Property

Error Codes            Frequently Asked Questions

Description

Reports if RAS services are available.

Syntax

object.RASAvailable

The syntax of the RASAvailable property has these parts:

Part	   	Description

object	A RAS control.

Remarks

This property tells your program whether RAS services are available or not.  If this property is True, you can use the RAS control to connect to remote servers.  If this property is False, RAS services are not available.

Data Type

Integer (boolean)


Refresh Method

See Also            Error Codes            Frequently Asked Questions

Description

Re-loads the list of phone book entries.

VBX Note: Methods are not available in the VBX version of this control.  Methods are only in the ActiveX / OCX version.  When using the VBX, you must use the Action property instead of the equivalent method.

Syntax

object.Refresh

The syntax of the Refresh method has these parts:

Part	   	Description

object	Required. A RAS control.

Remarks

This method makes the RAS control re-load the list of dialing entries in a phone book.  You specify the phone book to scan using the PhoneBook property.

Once this method completes, the EntryCount property will hold the number of entries in the phone book.  And, the EntryList property array will contain the names of the servers in the phone book.

Windows 95 Note: all phone book entries are kept in the registry.  So, the PhoneBook property is ignored.

VBX Note: Methods are not available in the VBX version of this control.  Methods are only in the ActiveX / OCX version.  When using the VBX, you must use the Action property instead of the equivalent method.


Version Property

Error Codes            Frequently Asked Questions

Description

Shows the version of the control.

Syntax

object.Version

The syntax of the Version property has these parts:

Part	   	Description

object	A RAS control.

Remarks

This property holds the current version of the control. It is read-only and available at both design-time and run-time.

Data Type

String


Getting Custom Controls Written

If you or your organization would like to have custom controls written, you can contact us at the following:

Mabry Software, Inc.

Post Office Box 31926

Seattle, WA  98103-1926

Phone: 206-634-1443

Fax: 206-632-0272 or 206-364-3196

Internet: mabry@mabry.com

You can also contact Zane Thomas.  He can be reached at:

Zane Thomas

Post Office Box 121

Indianola, WA  98342

Internet: zane@mabry.com


Licensing Information

Legalese Version

Mabry Software grants a license to use the enclosed software to the original purchaser.  Copies may be made for back-up purposes only.  Copies made for any other purpose are expressly prohibited, and adherence to this requirement is the sole responsibility of the purchaser.

Customer written executable applications containing embedded Mabry products may be freely distributed, without royalty payments to Mabry Software, provided that such distributed Mabry product is bound into these applications in such a way so as to prohibit separate use in design mode, and that such Mabry product is distributed only in conjunction with the customers own software product.  The Mabry Software product may not be distributed by itself in any form.

Neither source code for Mabry Software products nor modified source code for Mabry Software products may be distributed under any circumstances, nor may you distribute .OBJ, .LIB, etc. files that contain our routines. This control may be used as a constituent control only if the compound control thus created is distributed with and as an integral part of an application.  Permission to use this control as a constituent control does not grant a right to distribute the license (LIC) file or any other file other than the control executable itself. This license may be transferred to a third party only if all existing copies of the software and its documentation are also transferred.

This product is licensed for use by only one developer at a time.  Mabry Software expressly prohibits installing this product on more than one computer if there is any chance that both copies will be used simultaneously.  This restriction also extends to installation on a network server, if more than one workstation will be accessing the product.  All developers working on a project which includes a Mabry Software product, even though not working directly with the Mabry product, are required to purchase a license for that Mabry product.

This software is provided as is.  Mabry Software makes no warranty, expressed or implied, with regard to the software.  All implied warranties, including the warranties of merchantability and fitness for a particular use, are hereby excluded.

MABRY SOFTWARE'S LIABILITY IS LIMITED TO THE PURCHASE PRICE.  Under no circumstances shall Mabry Software or the authors of this product be liable for any incidental or consequential damages, nor for any damages in excess of the original purchase price.

To be eligible for free technical support by telephone, the Internet, CompuServe, etc. and to ensure that you are notified of any future updates, please complete the enclosed registration card and return it to Mabry Software.

English Version

We require that you purchase one copy of a control per developer on a project.  If this is met, you may distribute the control with your application royalty free.  You may never distribute the LIC file.  You may not change the product in any way that removes or changes the requirement of a license file.

We encourage the use of our controls as constituent controls when the compound controls you create are an integral part of your application.  But we don't allow distribution of our controls as constituents of other controls when the compound control is not part of an application.  The reason we need to have this restriction is that without it someone might decide to use our control as a constituent, add some trivial (or even non-trivial) enhancements and then sell the compound control.  Obviously there would be little difference between that and just plain reselling our control.

If you have purchased the source code, you may not re-distribute the source code either (nor may you copy it into your own project).  Mabry Software retains the copyright to the source code.

Your license is transferable.  The original purchaser of the product must make the transfer request.  Contact us for further information.

The sample versions of our products are intended for evaluation purposes only.  You may not use the sample version to develop completed applications.